﻿using System;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using OwnZTec.LojaDelivery.UI.WinForms.Properties;
using WebCamera;


namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmFuncionario : OwnZForm
    {
        #region -- Membros e construtores -------------------------------------------------------------------------------------------------
        public FrmFuncionarios Pai
        {
            get;
            set;
        }

        public bool Edicao
        {
            get;
            set;
        }

        private bool _alterado;

        public tbFuncionario Funcionario
        {
            get;
            set;
        }

        public FrmFuncionario()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        bool Carregado;

        private void FrmFuncionario_Load(object sender, EventArgs e)
        {
            Carregado = false;
            cmbFuncao.DataSource = Contexto.Db.tbFuncaos;
            cmbFuncao.ValueMember = "idFuncao";
            cmbFuncao.DisplayMember = "desFuncao";

            string[] Estados = { "AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PR", "PB", "PA", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SE", "SP", "TO" };

            foreach (string item in Estados)
            {
                cboEstado.Items.Add(item);
            }

            Carregar();

            oWebCam = new WebCam();
            oWebCam.Container = pbFuncionario;
            
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FrmFuncionario_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_alterado)
                return;

            var res = Contexto.MainForm.ExibirMensagemSairSemSalvar();

            if (res != DialogResult.Yes)
            {
                e.Cancel = true;
                return;
            }

            Dispose();
        }

        private void txtNome_TextChanged(object sender, EventArgs e)
        {
            _alterado = true;
        }

        private void cmbFuncao_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (Carregado)
            {
                _alterado = true;
                if (cmbFuncao.Text == "Motorista")
                    chkEntrega.Checked = true;
            }
        }

        private void txtNome_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (txtNome.Text.EhNuloOuVazio())
            {
                erpErro.SetError(txtNome, "Informar o nome do funcionário");
                e.Cancel = true;
                return;
            }

            erpErro.SetError(txtNome, "");
        }

        private void cmdLogin_Click(object sender, EventArgs e)
        {
            if (_alterado)
            {
                var res =
                Contexto.MainForm.ExibirMensagem(
                    "Para atribuir um usuário a este funcionário é necessário salvar primeiro. Deseja prosseguir?",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (res == DialogResult.No)
                    return;

                Salvar();
            }

            var frm = new FrmUsuario
            {
                Funcionario = Funcionario,
                FormFuncionario = this
            };

            frm.Closed += FrmUsuario_Closed;

            frm.ShowDialog(this);
        }

        private void cmdExcluirLogin_Click(object sender, EventArgs e)
        {
            var res = Contexto.MainForm.ExibirMensagem("Deseja excluir este usuário?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (res == DialogResult.No)
                return;

            Contexto.Db.tbUsuarios.DeleteObject(Funcionario.tbUsuario);

            Contexto.Db.SaveChanges();

            txtLogin.Text = "Não foi cadastrado um usuário";
            toolTip1.SetToolTip(cmdLogin, "Criar usuário");
            cmdLogin.Image = Resources.Usuario_adicionar;
            cmdExcluirLogin.Enabled = false;
        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            Salvar();

            Close();
        }

        private void FrmUsuario_Closed(object sender, EventArgs e)
        {
            Carregar();

            Pai.AtualizarGrid();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        public void AtualizarLogin(bool adicionado)
        {
            if (adicionado)
            {
                txtLogin.Text = Funcionario.tbUsuario.desLogin;
                toolTip1.SetToolTip(cmdLogin, "Editar usuário");
                cmdLogin.Image = Resources.Usuario_editar;
                cmdExcluirLogin.Enabled = true;
            }
            else
            {
                txtLogin.Text = "Não foi cadastrado um usuário";
                toolTip1.SetToolTip(cmdLogin, "Criar usuário");
                cmdLogin.Image = Resources.Usuario_adicionar;
                cmdExcluirLogin.Enabled = false;
            }

            Pai.AtualizarGrid();
        }

        private void Salvar()
        {
            Funcionario.desNomeFuncionario = txtNome.Text;
            Funcionario.idFuncao = (int)cmbFuncao.SelectedValue;
            Funcionario.RG = txtRG.Text;
            Funcionario.CPF = txtCPF.Text;
            Funcionario.Endereco = txtEndereco.Text;
            Funcionario.Numero = txtNumero.Text;
            Funcionario.Complemento = txtComplemento.Text;
            Funcionario.Bairro = txtBairro.Text;
            Funcionario.Cidade = txtCidade.Text;
            if (cboEstado.SelectedIndex >= 0)
                Funcionario.Estado = cboEstado.SelectedItem.ToString();
            Funcionario.CEP = txtCEP.Text;
            Funcionario.Telefone = txtTelefone.Text;
            Funcionario.Celular = txtCelular.Text;
            if (!String.IsNullOrEmpty(txtDtAdmissao.Text.Replace("/", "").Trim()))
                Funcionario.dtAdmissao = Convert.ToDateTime(txtDtAdmissao.Text);
            if (!String.IsNullOrEmpty(txtDtDemissao.Text.Replace("/", "").Trim()))
                Funcionario.dtDemissao = Convert.ToDateTime(txtDtDemissao.Text);
            Funcionario.CTPS = txtCTPS.Text;
            Funcionario.CTPS_Serie = txtSerie.Text;
            Funcionario.Foto = pbFuncionario.ImageLocation; // TODO: Corrigir para pegar o caminho
            Funcionario.flgAtivo = chkAtivo.Checked;
            Funcionario.flgEntrega = chkEntrega.Checked;

            if (!Edicao)
                Contexto.Db.tbFuncionarios.AddObject(Funcionario);


            Contexto.Db.SaveChanges();

            Edicao = true;

            _alterado = false;

            Pai.AtualizarGrid();
        }

        private void Carregar()
        {
            if (Edicao)
            {
                txtNome.Text = Funcionario.desNomeFuncionario;
                cmbFuncao.SelectedValue = Funcionario.tbFuncao.idFuncao;
                txtRG.Text = Funcionario.RG;
                txtCPF.Text = Funcionario.CPF;
                txtEndereco.Text = Funcionario.Endereco;
                txtNumero.Text = Funcionario.Numero;
                txtComplemento.Text = Funcionario.Complemento;
                txtBairro.Text = Funcionario.Bairro;
                txtCidade.Text = Funcionario.Cidade;
                cboEstado.SelectedItem = Funcionario.Estado;
                txtCEP.Text = Funcionario.CEP;
                txtTelefone.Text = Funcionario.Telefone;
                txtCelular.Text = Funcionario.Celular;
                if (Funcionario.dtAdmissao != null)
                    txtDtAdmissao.Text = Convert.ToDateTime(Funcionario.dtAdmissao).ToShortDateString();
                if (Funcionario.dtDemissao != null)
                    txtDtDemissao.Text = Convert.ToDateTime(Funcionario.dtDemissao).ToShortDateString();
                txtCTPS.Text = Funcionario.CTPS;
                txtSerie.Text = Funcionario.CTPS_Serie;
                if (Funcionario.flgAtivo != null)
                    chkAtivo.Checked = (bool)Funcionario.flgAtivo;
                else
                    chkAtivo.Checked = false;
                if (Funcionario.flgEntrega != null)
                    chkEntrega.Checked = (bool)Funcionario.flgEntrega;
                else
                    chkEntrega.Checked = false;
                pbFuncionario.ImageLocation = Funcionario.Foto;

                if (Funcionario.tbUsuario != null)
                {
                    txtLogin.Text = Funcionario.tbUsuario.desLogin;
                    toolTip1.SetToolTip(cmdLogin, "Editar usuário");
                    cmdLogin.Image = Resources.Usuario_editar;
                    cmdExcluirLogin.Enabled = true;
                }
                else
                    cmdExcluirLogin.Enabled = false;
            }
            else
            {
                Funcionario = new tbFuncionario();
                cmdExcluirLogin.Enabled = false;
            }

            _alterado = false;
            Carregado = true;
        }

        WebCam oWebCam;

        private void cmdAtivaCamera_Click(object sender, EventArgs e)
        {
            oWebCam.OpenConnection();
        }

        private void cmdSalvarImagem_Click(object sender, EventArgs e)
        {
            oWebCam.SaveImage();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------
    }
}
